Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

 <<   zurück
Visual Basic 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual Basic 2005

Visual Basic 2005
1.233 S., mit 2 CDs, 59,90 Euro
Galileo Computing
ISBN 3-89842-585-1
gp Kapitel 17 Standarddialoge programmieren
  gp 17.1 Einführung in die Standarddialoge
    gp 17.1.1 Das Öffnen eines Standarddialogs
  gp 17.2 Die Klasse »OpenFileDialog«
    gp 17.2.1 Die Beschriftung der Titelleiste
    gp 17.2.2 Festlegen eines Standardverzeichnisses
    gp 17.2.3 Die Klasse »Environment«
    gp 17.2.4 Einen Dateifilter setzen
    gp 17.2.5 Die ausgewählte Datei
    gp 17.2.6 Mehrfachauswahl von Dateien
    gp 17.2.7 Zusammenfassung der Eigenschaften und Methoden
    gp 17.2.8 Ereignisse von »OpenFileDialog«
    gp 17.2.9 Das Beispiel »Texteditor«
  gp 17.3 Die Klasse »SaveFileDialog«
    gp 17.3.1 Der Speichern-Dialog am Beispiel »TexteditorVers2«
  gp 17.4 Der Dialog »FolderBrowserDialog«
  gp 17.5 Die Klasse »ColorDialog«
  gp 17.6 Die Klasse »FontDialog«


Galileo Computing

17.3 Die Klasse »SaveFileDialog«  downtop

Die Klasse SaveFileDialog stellt ein Dialogfenster dar, das den Anwender zum Speichern einer Datei auffordert.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 17.4     Die Standardanzeige des Dialogs »SaveFileDialog«

Da die beiden Klassen SaveFileDialog und OpenFileDialog in FileDialog eine gemeinsame Basisklasse haben, ähneln sich beide Dialoge nicht nur optisch, sondern weisen auch viele gemeinsame Eigenschaften auf, beispielsweise Title, InitialDirectory und Filter. Verschaffen wir uns daher einen Überblick über die Eigenschaften, durch die sich die beiden Klassen unterscheiden.


Tabelle 17.3     Spezifische Eigenschaften der Klasse »SaveFileDialog«

Eigenschaft Beschreibung
AddExtension Ruft einen Wert ab oder legt diesen fest, der angibt, ob einem Dateinamen im Dialogfeld automatisch eine Erweiterung hinzugefügt wird, wenn der Benutzer keine Erweiterung angibt.
DefaultExt Legt die Standarddateinamenerweiterung fest oder ruft diese ab.
CreatePrompt Wenn auf True gesetzt, wird ein Meldungsfenster beim Speichern unter einem noch nicht vorhandenen Dateinamen angezeigt. Der Anwender muss den Speichervorgang bestätigen.
OverwritePrompt Bei der Standardeinstellung True wird ein Meldungsfenster angezeigt, wenn unter einem Dateinamen gespeichert werden soll, der im aktuellen Ordner bereits existiert. Der Anwender muss das Überschreiben der vorhandenen Datei bestätigen.

Viele Anwendungen ermöglichen einem Benutzer, auch ohne die Angabe einer Dateierweiterung eine Datei zu speichern. Eine passende Dateierweiterung wird dann automatisch angehängt. MS Word erweitert den Dateinamen beispielsweise um die Erweiterung .DOC, der Texteditor Notepad um .TXT. Wollen Sie diese Unterstützung auch in Ihrer eigenen Anwendung realisieren, setzt das zunächst voraus, dass die Eigenschaft AddExtension=True gesetzt wird. Der Eigenschaft DefaultExt teilen Sie die gewünschte Standarddateinamenerweiterung mit.

Übergeben Sie der Eigenschaft DefaultExt nicht den Punkt, der Dateinamen und Dateierweiterung voneinander trennt. Der Punkt wird automatisch eingefügt. Haben Sie eine anwendungsspezifische Dateierweiterung festgelegt und gibt der Anwender die Dateierweiterung trotzdem an, erkennt der Dialog das und hängt keine zweite an.


saveFileDialog1.AddExtension = True
saveFileDialog1.DefaultExt = "csh"

Die beiden Eigenschaften CreatePrompt und OverwritePrompt informieren den Anwender mit einem Meldungsfenster. Ist CreatePrompt=True und gibt der Anwender einen Dateinamen an, der im aktuell geöffneten Verzeichnis des Dialogs noch nicht vorhanden ist, wird im Meldungsfenster um Bestätigung gebeten, ob die Datei neu erstellt werden soll (siehe Abbildung 17.5).

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 17.5     Meldungsfenster der Eigenschaft »CreatePrompt«

Übernehmen Sie den Standardwert True der Eigenschaft OverwritePrompt, wird ein Meldungsfenster angezeigt, mit dem der Anwender bestätigen kann, ob eine vorhandene Datei gleichen Namens überschrieben werden soll.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 17.6     Meldungsfenster der Eigenschaft »OverwritePrompt«


Galileo Computing

17.3.1 Der Speichern-Dialog am Beispiel »TexteditorVers2«  toptop

Das Beispiel TexteditorVers1 aus Abschnitt 17.2.9 soll jetzt um eine Speicherfunktionalität erweitert werden. Der zusätzliche Code ist verhältnismäßig komplex, denn um den allgemein üblichen Anforderungen zu genügen, reicht es nicht aus, nur die Click-Ereignisse der beiden Menüelemente Speichern und Speichern unter... zu implementieren. Ein Dokument, das nach einem Speichervorgang eine Änderung erfahren hat, muss nämlich beispielsweise beim Schließen noch einmal automatisch oder auf Bestätigung hin gespeichert werden.

Eine der wichtigsten Informationen in unserem Beispielprogramm wird im Feld strFile vom Typ String vorgehalten. Es enthält die Information, in welcher Datei der Inhalt der Textbox gespeichert worden ist. Ist das Feld leer oder Nothing, wurde der Inhalt noch nicht gespeichert.

Wird der Inhalt der Textbox gespeichert, enthält strFile eine gültige Angabe. Zusätzlich benötigen wir aber auch noch die Information, ob sich der Textboxinhalt nach einer Speicherung noch einmal verändert hat. Das ist beispielsweise dann von Interesse, wenn das Formular geschlossen wird. Ist der aktuelle Inhalt bereits abgespeichert, kann das Fenster sofort geschlossen werden. Andernfalls muss der Anwender die Entscheidung treffen, ob er den letzten Stand speichern oder verwerfen will.

Mittelpunkt aller Speichervorgänge wird die benutzerdefinierte Methode SaveToFile sein, in welcher der Inhalt der Textbox einem Stream übergeben wird. Wir benutzen dazu ein Objekt vom Typ StreamWriter, dessen Konstruktor wir den Inhalt des Feldes strFile übergeben – also die Information über die Speicherlokalität. Über einen zweiten Parameter teilen wir mit, dass wir die vorhandene Datei überschreiben wollen. Mit der Write-Methode werden die Daten in die Datei geschrieben. Den Dateizugriff sichern wir mit einer Ausnahmebehandlung. Sollte kein Fehler auftreten, kann die Eigenschaft Modified der Textbox auf False gesetzt werden.


' Methode zum Speichern des Textboxinhalts
Private Sub SaveToFile()
Try
Dim sw As StreamWriter = New StreamWriter(strFile, False)
sw.Write(txtDatei.Text)
sw.Close()
Catch e As Exception
MessageBox.Show(e.Message)
Return
End Try
txtDatei.Modified = False
End Sub

Angestoßen wird das Speichern immer dann, wenn sich der Inhalt der Textbox geändert hat (dann gilt: Modified=True). Dabei gilt es, zwei Ausgangssituationen zu berücksichtigen:

gp  Der Inhalt der Textbox ist während der Sitzung noch nicht gespeichert worden. Dann ist der Inhalt des Feldes strFile leer oder null.
gp  Eine vorherige Speicherung hat das Feld strFile mit einem gültigen Wert belegt.

Die Prüfung, ob der Inhalt der Textbox bereits gespeichert worden ist, sowie den Anstoß zum Speichern vollzieht die Methode SaveDocument.


Private Sub SaveDocument()
If (Me.strFile IsNot Nothing AndAlso Me.strFile.Length > 0) Then
SaveFileDialog1.FileName = Me.strFile
End If
If (SaveFileDialog1.ShowDialog() = _
Windows.Forms.DialogResult.OK) Then
Me.strFile = SaveFileDialog1.FileName
Me.SaveToFile()
Me.SetFormTitle()
End If
End Sub

Die Methode prüft zuerst den Inhalt von strFile. Falls das Feld einen gültigen Wert aufweist, wird dieser der Eigenschaft FileName des SaveFileDialog-Objekts übergeben. Anschließend kann der Dialog geöffnet werden. Bevor wir die Datei endgültig speichern, müssen wir berücksichtigen, dass der Anwender unter Umständen einen anderen Dateinamen eingetragen hat. Deshalb wird mit


me.strFile = saveFileDialog1.FileName

der aktuelle Inhalt der Eigenschaft FileName dem Feld strFile übergeben und erst danach die Methode SaveToFile aufgerufen.

Üblicherweise werden in Texteditoren die Dateinamen des aktuell bearbeiteten Dokuments in der Titelleiste angezeigt. Wir realisieren das mit der Methode SetFormTitle:


Private Sub SetFormTitle()
If (Me.strFile Is Nothing OrElse Me.strFile.Length = 0) Then
Me.Text = "Unbenannt – " & "Texteditor"
Else
Me.Text = Path.GetFileName(Me.strFile) & " – " _
& "Texteditor"
End If
End Sub

Wenden wir uns nun den Speichervorgängen zu und hier zuerst dem Menü Speichern. Der Anwender könnte zur Laufzeit diese Option wählen, obwohl der Inhalt der Textbox vorher noch nicht gespeichert worden ist. In diesem Fall enthält strFile keine gültige Pfadangabe, und der Dialog zum Speichern muss in jedem Fall geöffnet werden. Das haben wir in der Methode SaveDocument implementiert.

Hat der Anwender jedoch vorher gespeichert, ist der Pfad zu der Datei im Feld strFile eingetragen. Es bedarf dann keiner Anzeige des Speichern-Dialogs, und das StreamWriter-Objekt kann in der Methode SaveToFile sofort aktiv werden.


' Ereignishandler des Click-Ereignisses des Menüs 'Speichern'
Private Sub mnuSpeichern_Click(...) Handles mnuSpeichern.Click
If (Me.strFile Is Nothing OrElse Me.strFile.Length = 0) Then
Me.SaveDocument()
Else
Me.SaveToFile()
End If
End Sub

Noch einfacher ist der Code des Ereignishandlers, der dem Menüelement Speichern unter... zugeordnet ist. Entscheidet sich der Anwender für diese Option, möchte er die Datei unter einem anderen Namen speichern. Wir müssen den Aufruf nur an SaveDocument weiterleiten.


' Ereignishandler des Click-Ereignisses des Menüs "Speichern unter..."
Private Sub mnuSpeichernUnter_Click(...) Handles mnuSpeichernUnter.Click
Me.SaveDocument()
End Sub

Der Anwender könnte auch den Menüpunkt Neu wählen, wenn sich in der Textbox noch Informationen befinden, die noch nicht gespeichert worden sind. Deshalb muss im entsprechenden Ereignishandler zuerst die Eigenschaft Modified der Textbox untersucht werden. Ist der Inhalt True, wird der Anwender durch ein Meldungsfenster dazu aufgefordert anzugeben, ob er den Inhalt seines Dokuments speichern oder doch lieber verwerfen möchte. Entscheidet er sich für das Speichern, bleibt wieder die Frage zu klären, ob der Inhalt zum ersten oder zum wiederholten Mal gespeichert wird. Abhängig davon wird entweder automatisch im Hintergrund gespeichert oder der Dialog zum Speichern geöffnet.


' Ereignishandler des Click-Ereignisses des Menüs "Neu"
Private Sub mnuNeu_Click(...) Handles mnuNeu.Click
If (txtDatei.Modified = True) Then
Dim dr As DialogResult = _
MessageBox.Show("Wollen Sie den Inhalt des Dokuments " _
& "speichern?", "Texteditor", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Question, _
MessageBoxDefaultButton.Button2)
Select Case (dr)
Case Windows.Forms.DialogResult.Yes
If (Me.strFile = Nothing Or Me.strFile.Length = 0) Then
Me.SaveDocument()
Else
Me.SaveToFile()
txtDatei.Modified = False
End If
Case Windows.Forms.DialogResult.No
Return
End Select
End If
txtDatei.Text = ""
txtDatei.Modified = False
strFile = Nothing
Me.SetFormTitle()
End Sub

Nun haben wir nahezu alle Menüelemente berücksichtigt, können das bisherige Ergebnis aber noch nicht als vollständig ansehen. Es gilt auch zu bedenken, dass der Anwender das Programm beendet, ohne vorher zu speichern. Der Texteditor unseres Beispiels kann geschlossen werden:

gp  durch die Wahl des Menüs Beenden
gp  über das Systemmenü
gp  über die X-Schaltfläche in der Titelleiste

Die Programmlogik, die hinter beiden Aktionen ausgeführt werden muss, ist dieselbe. Deshalb können wir auch eine allgemeine Methode entwickeln, die von dem Ereignishandler des Menüs Beenden und dem FormClosing-Ereignis der Form aufgerufen wird.


Private Sub SaveOnClosing()
If txtDatei.Modified = False Then
Return
End If
Dim dr As DialogResult = _
MessageBox.Show("Wollen Sie den Inhalt des Dokuments speichern?", _
"Texteditor", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Question, _
MessageBoxDefaultButton.Button2)
Select Case (dr)
Case Windows.Forms.DialogResult.Yes
If (Me.strFile Is Nothing OrElse Me.strFile.Length = 0) Then
Me.SaveDocument()
Else
Me.SaveToFile()
txtDatei.Modified = False
End If
Case Windows.Forms.DialogResult.No
Return
End Select
End Sub

Vergleichen Sie diese Methode mit dem Ereignishandler des Menüelements Neu, werden Sie feststellen, dass wir den Code weiter vereinfachen können, weil die Kernpassage identisch mit SaveOnClosing ist. Das führt uns zum folgenden Ergebnis:


' Ereignishandler des Click-Ereignisses des Menüs "Neu"
Private Sub mnuNeu_Click(... Handles mnuNeu.Click
' wenn das aktuelle Dokument nicht verändert worden ist
Me.SaveOnClosing()
txtDatei.Text = ""
txtDatei.Modified = False
strFile = Nothing
Me.SetFormTitle()
End Sub

Der Code des mit FormClosing verknüpften Ereignishandlers reduziert sich auf den einfachen Aufruf von SaveOnClosing:


Private Sub Form1_FormClosing(...) Handles MyBase.FormClosing
Me.SaveOnClosing()
End Sub

Was noch fehlt, ist der Code für das Menüelement Beenden. Hier wird wieder SaveOnClosing aufgerufen, jedoch wird vorher ein Meldungsfenster geschaltet, um das Schließen vom Anwender bestätigen zu lassen. Um denselben Methodenaufruf muss auch noch der Ereignishandler des Öffnen-Menüelements ergänzt werden.


' Ereignishandler des Click-Ereignisses des Menüs "Beenden"
Private Sub mnuBeenden_Click(...) Handles mnuBeenden.Click
Dim strMeldung As String = "Wollen Sie die Anwendung beenden?"
Dim result As DialogResult = MessageBox.Show(strMeldung, _
Application.ProductName, _
MessageBoxButtons.OKCancel, _
MessageBoxIcon.Question, _
MessageBoxDefaultButton.Button2)
If result = Windows.Forms.DialogResult.OK Then
Me.SaveOnClosing()
Application.Exit()
End If
End Sub

Den gesamten Code des Beispiels finden Sie auf der Buch-CD unter:

...\Kapitel 17\TexteditorVers2

 <<   zurück
  
  Zum Katalog
Zum Katalog: Visual Basic 2005
Visual Basic 2005
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Visual C# 2005






 Visual C# 2005


Zum Katalog: Fortgeschrittene Programmierung mit Visual C# 2005






 Fortgeschrittene
 Programmierung
 mit Visual C# 2005


Zum Katalog: Das Programmierhandbuch SQL Server 2005






 Das Programmier-
 handbuch
 SQL Server 2005


Zum Katalog: Einstieg in Visual Basic 2005






 Einstieg in
 Visual Basic 2005


Zum Katalog: Einstieg in Visual C# 2005






 Einstieg in
 Visual C# 2005


Zum Katalog: Konzepte und Lösungen für Microsoft-Netzwerke






 Konzepte und
 Lösungen für
 Microsoft-Netzwerke


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de